﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ElectronicCommerce.Framework.Diagnostics;
using ElectronicCommerce.Framework.Utility;

namespace ElectronicCommerce.Framework.ServiceModel
{
    /// <summary>
    /// 表示一个服务代理基类。
    /// </summary>
    public abstract class ServiceBrokerBase : IServiceBroker, IServiceProvider
    {
        /// <summary>
        /// 获取服务。
        /// </summary>
        /// <typeparam name="T">代表服务接口类型。</typeparam>
        /// <returns>服务。</returns>
        /// <remarks>
        /// 如果一个服务接口有多个实现，那么将获取以typeof(T)和type(T).Name唯一限定的服务。
        /// </remarks>
        public T GetService<T>() where T : class
        {
            return GetService<T>(string.Empty);
        }

        /// <summary>
        /// 获取以typeof(T)和serviceName唯一限定的服务。
        /// </summary>
        /// <typeparam name="T">代表服务接口类型。</typeparam>
        /// <param name="serviceName">服务名称。</param>
        /// <returns>服务。</returns>
        /// <remarks>
        /// 类型 <typeparamref name="T"/> 下对应的实现 <paramref name="serviceName"/> 是唯一的。
        /// 但对于全局来讲，不是唯一的。
        /// </remarks>
        public T GetService<T>(string serviceName) where T : class
        {
            if (StringHelper.IsEmpty(serviceName))
            {
                serviceName = typeof(T).Name;
            }

            return DoGetService<T>(serviceName);
        }

        /// <summary>
        /// 获取以serviceType和serviceName唯一限定的服务。
        /// </summary>
        /// <param name="serviceType">服务类型。</param>
        /// <returns>服务。</returns>
        public object GetService(Type serviceType)
        {
            return GetService(serviceType, string.Empty);
        }

        /// <summary>
        /// 获取以serviceType和serviceName唯一限定的服务。
        /// </summary>
        /// <param name="serviceName">服务名称。</param>
        /// <param name="serviceType">服务类型。</param>
        /// <returns>服务。</returns>
        public object GetService(Type serviceType, string serviceName)
        {
            Check.Argument.IsNotNull("serviceType", serviceType);
            if (StringHelper.IsEmpty(serviceName))
            {
                serviceName = serviceType.GetType().Name;
            }

            return DoGetService(serviceType, serviceName);
        }

        /// <summary>
        /// 获取以typeof(T)和serviceName唯一限定的服务。
        /// </summary>
        /// <typeparam name="T">代表服务接口类型。</typeparam>
        /// <param name="serviceName">服务名称。</param>
        /// <returns>服务。</returns>
        /// <remarks>
        /// 类型 <typeparamref name="T"/> 下对应的实现 <paramref name="serviceName"/> 是唯一的。
        /// 但对于全局来讲，不是唯一的。
        /// </remarks>
        public virtual T DoGetService<T>(string serviceName) where T : class
        {
            return GetService(typeof(T), serviceName) as T;
        }

        /// <summary>
        /// 获取以serviceType和serviceName唯一限定的服务。
        /// </summary>
        /// <param name="serviceName">服务名称。</param>
        /// <param name="serviceType">服务类型。</param>
        /// <returns>服务。</returns>
        public abstract object DoGetService(Type serviceType, string serviceName);
    }
}
